总评
《深入理解计算机系统》书名的翻译存在一定的误导,英文原名《Computer Systems A Programmer‘s Perspective》直译为 《程序员视角下的计算机系统》,所以使用CS:APP指代这本书。
先上结论:CS:APP,值得学习。这本书站在初学者的视角,对计算机系统几大重要的部分做了深入浅出的介绍。如果读起来有困难,可以学得更深入一点后在尝试,心急的话可以辅以网课。不要怕耗费时间,付出的时间对得起获得的知识。
对于计算机相关的初学者,看着厚厚的一本书,没有勇气开始阅读的话,请想想大学上过的许多不知所谓的课,空耗时间,收获寥寥。而这本给初学者量身定做的书,则会给你带来收获知识的惊喜。
劝学结束,开始个人的感想。
关于版本,我阅读的是中文版。(英文阅读学习能力欠缺,日后加强)首先,在2019年6月第1版中确实存在几处明显的错误,但很容易分辨,绝不可能影响理解。其次,对于翻译质量的争议,大可不必。对于专业书籍,名词准确,前后逻辑连贯就是合格的。中文版CSAPP毋庸置疑是合格的,由于原版的内容就足够优质,翻译的中文版质量远超国内大多数教科书。最后,因为微不足道的缺陷就做出否定判断,不是学习良好态度。
关于内容深度,本书是CMU计算机相关专业的先行必修课,内容的特点在于覆盖面广,通俗易懂,由浅入深。有人指责其内容过浅可以跳过不读,直接读专门书籍,对此,我的看法是,这本书整体并不浅,先读专门书籍,再回头读这本书,也会有惊喜的收获。如果先读CS:APP,也请不要止步于此,继续阅读专门书籍,深入学习理论,并积极参加实践,实现理论。
阅读前水平
先对能力水平做一个简单的划分。
阶段名称 | 阶段能力 |
---|---|
小白阶段 | 没接触过计算类专业,只是电子产品用户 |
初学阶段 | 学习过编程语言,对计算机系统的几个部分有简单的了解 |
中等阶段 | 对计算机系统整体有一定的了解,对几个方向有深入的认识 |
高等阶段 | 对计算机系统的各个环节如数家珍,但不要求在多个方向有创见 |
…. | …… |
我曾在初学阶段购买了这本书,尝试阅读,最终在第三章终止了阅读。一方面是没有时间,另一方面是缺乏自学的前置知识,挫败感很强。
进行了更加深入的学习,列举几个比较重要的项目
搭建一个单周期CPU,运行机器指令程序(涉及计算机组成)
一个网络探测项目的后端搭建(涉及计算机网络,python)
编译原理相关的实验 (涉及编译,LLVM)
实现了支持多客户端的TLS VPN项目(涉及计算机网络, 多线程多进程并发)
组队从零实现了一个在硬件平台上可用的RISCV架构的类UNIX 操作系统 (涉及ISA,OS, 编译,链接,装载)
做完这些,我自认为已经走到了初学阶段的末期,摸到了中等阶段的门槛。
之后,重读CS:APP,速度前快,中慢,后快,粗略估计总耗时30~40h。
有一种水平恰好相当的感觉,熟知的内容和陌生的内容六四开,读起来很舒适。
CSAPP章节简评
由于我个人的学习和实践经历,以下章节的难度为主观评价,仅供参考
章节名称 | 难度 | 备注 |
---|---|---|
第1章 计算机系统漫游 | 易 | 入门常识 |
第2章 信息的表示和处理 | 中 | |
第3章 程序的机器级表示 | 中 | 涉及过汇编 |
第4章 处理器体系结构 | 难 | 大部分未涉及过 |
第5章 优化程序性能 | 易 | 较好懂,但难精 |
第6章 存储器层次结构 | 中 | 计组涉及过部分 |
第7章 链接 | 难 | 即使涉及过,还是难 |
第8章 异常控制流 | 难 | 大部分未涉及过 |
第9章 虚拟内存 | 中 | 部分涉及过 |
第10章 系统及I/O | 中 | |
第11章 网络编程 | 易 | 部分涉及过 |
第12章 并发编程 | 中 | 部分涉及过 |
后续工作
有很多可以延伸地方:
《C++反汇编与逆向分析技术揭秘》作为 第3章 程序的机器级表示 的扩展。如果不熟悉C++,但是熟悉C,推荐《C++ primer》中英两版皆可,作为入门,然后上手一个1500行+ 的C++ 项目即可。
《计算机组成与设计 硬件/软件接口》 作为 第4,5,6章 的深入学习,更高阶的可以参考《计算机体系结构》
《程序员的自我修养——链接、装载与库》 作为第7章 链接 的扩展,第7章有很多看着云里雾里的地方,需要加强学习。
由于已经实现过一个OS内核,对于第9章和第10章的内容是较为熟悉的,对于主流OS的实现并不熟悉,可以深入学习Linux内核。如果此前对OS实现并不了解,可以参考一些OS数据,《操作系统导论》可以作为入门书籍。
后三章的内容比较综合,都是我在各类项目中接触到的,可以参考《TCP/IP 详解》卷一 卷二 用于了解网络协议栈的细节及其实现; modern C++的一些并发特性的实现,陈天 · Rust 编程第一课,这两者可以用于查看不同语言对于高并发的支持; 还可以查看 高性能服务器相关的书籍,这些涉及到架构设计方面,与分布式系统有强相关就不拓展了,以后有机会,可以试试这个方向。
CS:APP 对于编译这个阶段是一笔带过的,但是这个部分也很重要,可以参考这个博客 学习编程语言与编译优化的一个书单 包括了:《程序设计语言——实践之路》(介绍语言及编译的大背景);《自制编译器》 作者青木峰郎,有一个可用的C子集编译器实现;《编译器设计》,覆盖编译初级到中级的知识
除了这些计算机系统的相关知识外,最重要的技能 应该是 编程能力和英语,
编程和算法方向参考书籍如下:《数据结构和算法分析 C语言版》、《算法导论》、《编程珠玑》以及刷题。
英语,各人有各人的方法,我主要是 刻意学习,学以致用。
最后的话
读完CS:APP,做了一些有趣的项目,给了我坚持做下去的信心。但在这里,需要给自己一些警醒。CS:APP 的英文版是国内一些高校系统编程教材,我只是做完了别人初入大二做了的东西。
另外,也不必过于焦虑,学习是一个渐进的过程,我享受的是收获新知,勤于思考,并不是与人争逐。每一步都踩得踏实,会走得更远。